/**
 * 校园二手交易平台 - 搜索数据模型
 * 为校园二手交易平台设计的搜索相关数据类型定义
 */

import { ProductCategory, ProductCondition, TransactionMethod, Product } from './product';

/**
 * 校区枚举 - 支持多校区校园
 */
export enum Campus {
  /** 主校区 */
  MAIN = 'main',
  /** 东校区 */
  EAST = 'east',
  /** 西校区 */
  WEST = 'west',
  /** 南校区 */
  SOUTH = 'south',
  /** 北校区 */
  NORTH = 'north',
  /** 新校区 */
  NEW = 'new',
  /** 老校区 */
  OLD = 'old'
}

/**
 * 学院/专业枚举
 */
export enum Faculty {
  /** 计算机科学与技术 */
  COMPUTER_SCIENCE = 'computer_science',
  /** 电子信息工程 */
  ELECTRONICS = 'electronics',
  /** 机械工程 */
  MECHANICAL = 'mechanical',
  /** 土木工程 */
  CIVIL_ENGINEERING = 'civil_engineering',
  /** 经济管理 */
  ECONOMICS_MANAGEMENT = 'economics_management',
  /** 文学与传媒 */
  LITERATURE_MEDIA = 'literature_media',
  /** 艺术设计 */
  ART_DESIGN = 'art_design',
  /** 医学 */
  MEDICINE = 'medicine',
  /** 法学 */
  LAW = 'law',
  /** 理学 */
  SCIENCE = 'science',
  /** 教育学 */
  EDUCATION = 'education',
  /** 其他 */
  OTHER = 'other'
}

/**
 * 搜索排序方式枚举
 */
export enum SearchSortBy {
  /** 相关性 */
  RELEVANCE = 'relevance',
  /** 价格升序 */
  PRICE_ASC = 'price_asc',
  /** 价格降序 */
  PRICE_DESC = 'price_desc',
  /** 发布时间升序 */
  CREATED_AT_ASC = 'created_at_asc',
  /** 发布时间降序 */
  CREATED_AT_DESC = 'created_at_desc',
  /** 浏览量降序 */
  VIEWS_DESC = 'views_desc',
  /** 收藏数降序 */
  FAVORITES_DESC = 'favorites_desc',
  /** 距离（如果支持地理位置） */
  DISTANCE = 'distance'
}

/**
 * 搜索建议类型
 */
export enum SearchSuggestionType {
  /** 热门搜索词 */
  HOT_KEYWORD = 'hot_keyword',
  /** 分类建议 */
  CATEGORY = 'category',
  /** 标签建议 */
  TAG = 'tag',
  /** 品牌建议 */
  BRAND = 'brand',
  /** 学院建议 */
  FACULTY = 'faculty'
}

/**
 * 搜索参数接口
 */
export interface SearchParams {
  /** 搜索关键词 */
  keyword?: string;
  /** 商品类别 */
  category?: ProductCategory;
  /** 子类别 */
  subCategory?: string;
  /** 新旧程度 */
  condition?: ProductCondition;
  /** 交易方式 */
  transactionMethod?: TransactionMethod;
  /** 价格范围 */
  priceRange?: {
    min?: number;
    max?: number;
  };
  /** 校区筛选 */
  campus?: Campus;
  /** 学院/专业筛选 */
  faculty?: Faculty;
  /** 是否支持议价 */
  isNegotiable?: boolean;
  /** 是否包邮 */
  isFreeShipping?: boolean;
  /** 是否只显示面交商品 */
  onlyFaceToFace?: boolean;
  /** 排序方式 */
  sortBy?: SearchSortBy;
  /** 排序方向 */
  sortOrder?: 'asc' | 'desc';
  /** 页码 */
  page?: number;
  /** 每页数量 */
  pageSize?: number;
  /** 地理位置信息（用于距离排序） */
  location?: {
    latitude: number;
    longitude: number;
    radius?: number; // 搜索半径（单位：公里）
  };
  /** 标签筛选 */
  tags?: string[];
  /** 是否只显示上架商品 */
  onlyActive?: boolean;
}

/**
 * 搜索建议项
 */
export interface SearchSuggestion {
  /** 建议ID */
  id: string;
  /** 建议类型 */
  type: SearchSuggestionType;
  /** 建议内容 */
  value: string;
  /** 显示文本 */
  displayText: string;
  /** 相关商品数量 */
  count?: number;
  /** 建议权重（用于排序） */
  weight?: number;
  /** 图标URL（可选） */
  icon?: string;
  /** 分类路径（如果类型为分类） */
  categoryPath?: string[];
}

/**
 * 搜索建议响应
 */
export interface SearchSuggestionResponse {
  /** 搜索关键词 */
  query: string;
  /** 建议列表 */
  suggestions: string[];
  /** 热门关键词 */
  popularKeywords: string[];
  /** 相关分类 */
  relatedCategories: string[];
}

/**
 * 搜索筛选条件选项
 */
export interface SearchFilterOption {
  /** 选项值 */
  value: string;
  /** 显示文本 */
  label: string;
  /** 相关商品数量 */
  count: number;
  /** 是否选中 */
  selected?: boolean;
  /** 是否禁用 */
  disabled?: boolean;
  /** 子选项（用于多级分类） */
  children?: SearchFilterOption[];
}

/**
 * 搜索筛选条件组
 */
export interface SearchFilterGroup {
  /** 筛选条件ID */
  id: string;
  /** 筛选条件名称 */
  name: string;
  /** 筛选选项 */
  options: SearchFilterOption[];
  /** 筛选类型（单选、多选、范围等） */
  type: 'single' | 'multiple' | 'range' | 'boolean';
  /** 是否支持搜索 */
  searchable?: boolean;
  /** 是否可折叠 */
  collapsible?: boolean;
  /** 默认是否展开 */
  defaultExpanded?: boolean;
}

/**
 * 搜索结果接口
 */
export interface SearchResult {
  /** 商品列表 */
  products: Product[];
  /** 总数量 */
  total: number;
  /** 当前页码 */
  currentPage: number;
  /** 总页数 */
  totalPages: number;
  /** 每页数量 */
  pageSize: number;
  /** 搜索用时（毫秒） */
  searchTime: number;
  /** 是否使用了缓存 */
  cached?: boolean;
  /** 搜索建议（相关搜索） */
  relatedSearches?: SearchSuggestion[];
  /** 可用筛选条件 */
  availableFilters?: SearchFilterGroup[];
  /** 搜索关键词分析 */
  keywordAnalysis?: {
    /** 是否拼写纠正 */
    corrected?: boolean;
    /** 原始关键词 */
    originalKeyword?: string;
    /** 纠正后的关键词 */
    correctedKeyword?: string;
    /** 关键词分词结果 */
    tokens?: string[];
  };
}

/**
 * 热门搜索词
 */
export interface HotSearchKeyword {
  /** 关键词 */
  keyword: string;
  /** 搜索次数 */
  searchCount: number;
  /** 最近搜索时间 */
  lastSearchedAt: Date;
  /** 趋势（上升、下降、平稳） */
  trend: 'up' | 'down' | 'stable';
  /** 趋势变化幅度 */
  trendChange?: number;
  /** 所属分类（如果可分类） */
  category?: ProductCategory;
}

/**
 * 搜索历史记录
 */
export interface SearchHistory {
  /** 记录ID */
  id: string;
  /** 搜索关键词 */
  keyword: string;
  /** 搜索时间 */
  searchedAt: Date;
  /** 搜索参数（完整的搜索条件） */
  searchParams?: SearchParams;
  /** 搜索结果数量 */
  resultCount?: number;
  /** 是否收藏 */
  isFavorite?: boolean;
}

/**
 * 智能搜索上下文
 */
export interface SearchContext {
  /** 用户ID（如果已登录） */
  userId?: string;
  /** 用户地理位置 */
  userLocation?: {
    latitude: number;
    longitude: number;
  };
  /** 用户所在校区 */
  userCampus?: Campus;
  /** 用户所在学院 */
  userFaculty?: Faculty;
  /** 用户搜索历史 */
  userSearchHistory?: SearchHistory[];
  /** 用户偏好设置 */
  userPreferences?: {
    preferredCategories?: ProductCategory[];
    preferredPriceRange?: { min: number; max: number };
    preferredTransactionMethod?: TransactionMethod;
    showDistance?: boolean;
  };
  /** 设备信息 */
  deviceInfo?: {
    platform: 'web' | 'mobile' | 'app';
    screenSize: 'small' | 'medium' | 'large';
  };
  /** 搜索场景 */
  searchScenario: 'normal' | 'quick' | 'advanced' | 'recommendation';
}

/**
 * 高级搜索配置
 */
export interface AdvancedSearchConfig {
  /** 是否启用价格筛选 */
  enablePriceFilter: boolean;
  /** 是否启用校区筛选 */
  enableCampusFilter: boolean;
  /** 是否启用学院筛选 */
  enableFacultyFilter: boolean;
  /** 是否启用地理位置筛选 */
  enableLocationFilter: boolean;
  /** 是否启用多选分类 */
  enableMultiCategory: boolean;
  /** 是否启用商品状态筛选 */
  enableStatusFilter: boolean;
  /** 是否启用发布时间筛选 */
  enableDateFilter: boolean;
  /** 是否启用智能排序 */
  enableSmartSorting: boolean;
  /** 最大搜索半径（公里） */
  maxSearchRadius: number;
  /** 支持的排序方式 */
  supportedSortOptions: SearchSortBy[];
}

/**
 * 搜索统计信息
 */
export interface SearchStats {
  /** 总搜索次数 */
  totalSearches: number;
  /** 今日搜索次数 */
  todaySearches: number;
  /** 热门搜索词（前10） */
  topKeywords: HotSearchKeyword[];
  /** 搜索成功率 */
  successRate: number;
  /** 平均搜索用时（毫秒） */
  averageSearchTime: number;
  /** 分类搜索统计 */
  categoryStats: Record<ProductCategory, number>;
  /** 校区搜索统计 */
  campusStats: Record<Campus, number>;
  /** 学院搜索统计 */
  facultyStats: Record<Faculty, number>;
}

/**
 * 默认搜索参数
 */
export const DEFAULT_SEARCH_PARAMS: SearchParams = {
  page: 1,
  pageSize: 20,
  onlyActive: true,
  sortBy: SearchSortBy.RELEVANCE
};

/**
 * 校区显示名称映射
 */
export const CAMPUS_DISPLAY_NAMES: Record<Campus, string> = {
  [Campus.MAIN]: '主校区',
  [Campus.EAST]: '东校区',
  [Campus.WEST]: '西校区',
  [Campus.SOUTH]: '南校区',
  [Campus.NORTH]: '北校区',
  [Campus.NEW]: '新校区',
  [Campus.OLD]: '老校区'
};

/**
 * 学院显示名称映射
 */
export const FACULTY_DISPLAY_NAMES: Record<Faculty, string> = {
  [Faculty.COMPUTER_SCIENCE]: '计算机科学与技术',
  [Faculty.ELECTRONICS]: '电子信息工程',
  [Faculty.MECHANICAL]: '机械工程',
  [Faculty.CIVIL_ENGINEERING]: '土木工程',
  [Faculty.ECONOMICS_MANAGEMENT]: '经济管理',
  [Faculty.LITERATURE_MEDIA]: '文学与传媒',
  [Faculty.ART_DESIGN]: '艺术设计',
  [Faculty.MEDICINE]: '医学',
  [Faculty.LAW]: '法学',
  [Faculty.SCIENCE]: '理学',
  [Faculty.EDUCATION]: '教育学',
  [Faculty.OTHER]: '其他'
};

/**
 * 排序方式显示名称映射
 */
export const SEARCH_SORT_BY_DISPLAY_NAMES: Record<SearchSortBy, string> = {
  [SearchSortBy.RELEVANCE]: '相关性',
  [SearchSortBy.PRICE_ASC]: '价格从低到高',
  [SearchSortBy.PRICE_DESC]: '价格从高到低',
  [SearchSortBy.CREATED_AT_ASC]: '发布时间从早到晚',
  [SearchSortBy.CREATED_AT_DESC]: '发布时间从晚到早',
  [SearchSortBy.VIEWS_DESC]: '浏览量从高到低',
  [SearchSortBy.FAVORITES_DESC]: '收藏数从高到低',
  [SearchSortBy.DISTANCE]: '距离'
};

/**
 * 工具函数：验证搜索参数
 */
export const validateSearchParams = (params: SearchParams): boolean => {
  // 检查价格范围
  if (params.priceRange) {
    const { min, max } = params.priceRange;
    if (min && max && min > max) {
      return false;
    }
    if (min && min < 0) {
      return false;
    }
    if (max && max < 0) {
      return false;
    }
  }
  
  // 检查页码和页面大小
  if (params.page && params.page < 1) {
    return false;
  }
  if (params.pageSize && (params.pageSize < 1 || params.pageSize > 100)) {
    return false;
  }
  
  return true;
};

/**
 * 工具函数：生成搜索查询字符串
 */
export const generateSearchQueryString = (params: SearchParams): string => {
  const queryParams = new URLSearchParams();
  
  if (params.keyword) queryParams.set('q', params.keyword);
  if (params.category) queryParams.set('category', params.category);
  if (params.condition) queryParams.set('condition', params.condition);
  if (params.transactionMethod) queryParams.set('transactionMethod', params.transactionMethod);
  if (params.campus) queryParams.set('campus', params.campus);
  if (params.faculty) queryParams.set('faculty', params.faculty);
  if (params.page) queryParams.set('page', params.page.toString());
  if (params.pageSize) queryParams.set('pageSize', params.pageSize.toString());
  if (params.sortBy) queryParams.set('sortBy', params.sortBy);
  if (params.sortOrder) queryParams.set('sortOrder', params.sortOrder);
  
  // 价格范围
  if (params.priceRange) {
    const { min, max } = params.priceRange;
    if (min) queryParams.set('minPrice', min.toString());
    if (max) queryParams.set('maxPrice', max.toString());
  }
  
  // 布尔参数
  if (params.isNegotiable) queryParams.set('negotiable', 'true');
  if (params.isFreeShipping) queryParams.set('freeShipping', 'true');
  if (params.onlyFaceToFace) queryParams.set('faceToFace', 'true');
  if (params.onlyActive) queryParams.set('active', 'true');
  
  return queryParams.toString();
};

/**
 * 工具函数：解析搜索查询字符串
 */
export const parseSearchQueryString = (queryString: string): SearchParams => {
  const params = new URLSearchParams(queryString);
  const searchParams: SearchParams = {};
  
  if (params.has('q')) searchParams.keyword = params.get('q') || undefined;
  if (params.has('category')) searchParams.category = params.get('category') as ProductCategory;
  if (params.has('condition')) searchParams.condition = params.get('condition') as ProductCondition;
  if (params.has('transactionMethod')) searchParams.transactionMethod = params.get('transactionMethod') as TransactionMethod;
  if (params.has('campus')) searchParams.campus = params.get('campus') as Campus;
  if (params.has('faculty')) searchParams.faculty = params.get('faculty') as Faculty;
  if (params.has('page')) searchParams.page = parseInt(params.get('page') || '1');
  if (params.has('pageSize')) searchParams.pageSize = parseInt(params.get('pageSize') || '20');
  if (params.has('sortBy')) searchParams.sortBy = params.get('sortBy') as SearchSortBy;
  if (params.has('sortOrder')) searchParams.sortOrder = params.get('sortOrder') as 'asc' | 'desc';
  
  // 价格范围
  const minPrice = params.get('minPrice');
  const maxPrice = params.get('maxPrice');
  if (minPrice || maxPrice) {
    searchParams.priceRange = {
      min: minPrice ? parseFloat(minPrice) : undefined,
      max: maxPrice ? parseFloat(maxPrice) : undefined
    };
  }
  
  // 布尔参数
  if (params.has('negotiable')) searchParams.isNegotiable = true;
  if (params.has('freeShipping')) searchParams.isFreeShipping = true;
  if (params.has('faceToFace')) searchParams.onlyFaceToFace = true;
  if (params.has('active')) searchParams.onlyActive = true;
  
  return searchParams;
};

/**
 * 工具函数：合并搜索参数
 */
export const mergeSearchParams = (baseParams: SearchParams, newParams: Partial<SearchParams>): SearchParams => {
  return {
    ...baseParams,
    ...newParams,
    priceRange: {
      ...baseParams.priceRange,
      ...newParams.priceRange
    }
  };
};

/**
 * 工具函数：检查搜索参数是否为空
 */
export const isEmptySearchParams = (params: SearchParams): boolean => {
  return !params.keyword && 
         !params.category && 
         !params.condition && 
         !params.transactionMethod && 
         !params.campus && 
         !params.faculty && 
         !params.priceRange &&
         !params.isNegotiable &&
         !params.isFreeShipping &&
         !params.onlyFaceToFace;
};